#include "user_uart.h"
uint8_t uart_dma_buffer[512];//串口dma缓冲区
uint8_t uart_read_buffer[512];
uint8_t uart_dma_flag;//接收完成标志位
void user_uart_init(void)
{
    //打开dma
    HAL_UARTEx_ReceiveToIdle_DMA(&huart1,uart_dma_buffer,sizeof(uart_dma_buffer));
    __HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
}
/**
 * @brief 串口发送重定向
 * @param huart 
 * @param format 
 * @param ... 
 * @return none
 */
int user_printf(UART_HandleTypeDef *huart,const char *format,...)
{
    char buffer[512]; // 临时存储格式化后的字符串
	va_list arg;      // 处理可变参数
	int len;          // 最终字符串长度

	va_start(arg,format);
	// 安全地格式化字符串到 buffer
	len = vsnprintf(buffer,sizeof(buffer),format,arg);
	va_end(arg);

	// 通过 HAL 库发送 buffer 中的内容
	HAL_UART_Transmit(huart,(uint8_t *)buffer,(uint16_t)len, 0xFF);
	return len;
}
/**
 * @brief 串口空闲中断回调函数
 * @param huart 
 * @param Size 
 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart,uint16_t Size)
{
    if(huart->Instance == USART1)
    {
        //关闭DMA接收,防止缓冲区数据出错
        HAL_UART_DMAStop(&huart1);
        //将dma缓冲区数据放入读取缓冲区
        memcpy(uart_read_buffer,uart_dma_buffer,Size);
        //拉高数据缓存成功标志位
        uart_dma_flag = 1;
        //清空dma缓冲区为下一次接收做准备
        memset(uart_dma_buffer,0,sizeof(uart_dma_buffer));
        //再次打开dma为下一次接收做准备
        HAL_UARTEx_ReceiveToIdle_DMA(&huart1,uart_dma_buffer,sizeof(uart_dma_buffer));
        __HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
    }
}
/**
 * @brief 串口数据解析函数
 * @param none
 * @return none
 */
uint8_t user_switch = 0;
void uart_task(void)
{
 //如果读取缓冲区无数据则直接返回
    if(uart_dma_flag == 0) return;
	//数据解析部分
    int num;//成功解析的字符串长度存储变量
    int x,y;
    /*uint8_t result = sscanf((const char *)uart_read_buffer,"switch%n",&x,&y,&num);
    if(result == 2 && strlen((const char *)uart_read_buffer) == (uint8_t)num)
    {
       user_switch^=1;
    }
    else
    {
        user_printf(&huart1,"error!\r\n");
    }*/
   if(strcmp("switch",uart_read_buffer) == 0)
   {
    user_switch ^= 1;
   }
    //状态重置,为下一次解析做准备
    memset(uart_read_buffer,0,sizeof(uart_read_buffer));
    uart_dma_flag = 0;
}